package br.com.sovi.gwt.client.inicio.login;

import java.util.List;

import br.com.sovi.gwt.client.application.Application;
import br.com.sovi.gwt.client.application.ApplicationConstants;
import br.com.sovi.gwt.client.autenticacao.service.AutenticacaoService;
import br.com.sovi.gwt.client.autenticacao.service.AutenticacaoServiceAsync;
import br.com.sovi.gwt.client.entity.autenticacao.Usuario;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.data.SimpleStore;
import com.gwtext.client.data.Store;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextField;

public class LoginPanel extends Panel {
	private AutenticacaoServiceAsync async = GWT.create(AutenticacaoService.class);

	private static final String EMPRESA_COOKIE = "sovi_empresa_cookie";

	private FormPanel empresaPanel, loginPanel;

	private TextField empresaField;

	private ComboBox usuarioBox;

	private TextField senhaField;

	private LoginListener listener;

	public LoginPanel(LoginListener listener) {
		this.listener = listener;

		this.setBorder(false);
		this.setPaddings(5);

		this.add(buildEmpresaForm());
		this.add(buildLoginForm());

		String empresaCodigoFromCookie = Cookies.getCookie(EMPRESA_COOKIE);
		if (empresaCodigoFromCookie != null && empresaCodigoFromCookie != "") {
			buscarUsuarios(empresaCodigoFromCookie);
		}
	}

	private FormPanel buildEmpresaForm() {
		empresaPanel = new FormPanel(Position.TOP);
		empresaPanel.setWidth(200);
		empresaPanel.setPaddings(5);

		empresaField = new TextField("Código da Empresa");
		empresaPanel.add(empresaField);
		empresaPanel.addButton(new Button("Buscar Usuários", new ButtonListenerAdapter() {
			@Override
			public void onClick(Button button, EventObject e) {
				buscarUsuarios(empresaField.getText());
			}
		}));

		return empresaPanel;
	}

	private FormPanel buildLoginForm() {
		loginPanel = new FormPanel(Position.TOP);
		loginPanel.setWidth(200);
		loginPanel.setPaddings(5);

		usuarioBox = new ComboBox("Usuário");
		senhaField = new TextField("Senha");

		usuarioBox.setDisplayField("nome");
		usuarioBox.setValueField("login");
		usuarioBox.setMode(ComboBox.LOCAL);
		usuarioBox.setTriggerAction(ComboBox.ALL);
		usuarioBox.setSelectOnFocus(true);
		usuarioBox.setEmptyText("Selecione um usuário...");

		usuarioBox.setWidth(150);
		usuarioBox.setMinListWidth(160);

		senhaField.setPassword(true);

		loginPanel.add(usuarioBox);
		loginPanel.add(senhaField);

		loginPanel.addButton(new Button("Efetuar Login", new ButtonListenerAdapter() {
			@Override
			public void onClick(Button button, EventObject e) {
				efetuarLogin();
			}
		}));

		loginPanel.addButton(new Button("Cancelar", new ButtonListenerAdapter() {
			@Override
			public void onClick(Button button, EventObject e) {
				showEmpresaPanel();
				Cookies.removeCookie(EMPRESA_COOKIE);
			}
		}));

		loginPanel.setVisible(false);

		return loginPanel;
	}

	public void buscarUsuarios(final String codigoEmpresa) {
		async.getUsuariosByCodigoEmpresa(codigoEmpresa, new AsyncCallback<List<Usuario>>() {
			@Override
			public void onSuccess(List<Usuario> result) {
				if (result == null || result.size() == 0) {
					Window.alert("Nenhum usuário encontrado.");
				}
				else {
					String[][] values = new String[result.size()][];

					for (int i = 0; i < values.length; i++) {
						Usuario usuario = result.get(i);
						values[i] = new String[] { usuario.getNome(), usuario.getLogin() };
					}

					Store store = new SimpleStore(new String[] { "nome", "login" }, values);
					store.load();

					usuarioBox.setStore(store);

					showLoginPanel();

					Cookies.setCookie(EMPRESA_COOKIE, codigoEmpresa);
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Ocorreu um erro ao buscar os usuários.");
			}
		});
	}

	protected void efetuarLogin() {
		async.efetuarLogin(usuarioBox.getText(), senhaField.getText(), new AsyncCallback<Usuario>() {

			@Override
			public void onSuccess(Usuario result) {
				if (result != null) {
					Application.get().addAttribute(ApplicationConstants.USUARIO_LOGADO_ATTR, result);
					listener.onLoginSuccess((Usuario) result);
				}
				else {
					listener.onLoginFailed("Informações incorretas.");
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Ocorreu um erro ao efetuar login.");
			}

		});
	}

	protected void showLoginPanel() {
		empresaPanel.setVisible(false);
		loginPanel.setVisible(true);
	}

	protected void showEmpresaPanel() {
		loginPanel.setVisible(false);
		empresaPanel.setVisible(true);
	}

	public void limparCampos() {
		empresaField.setValue("");
		senhaField.setValue("");
	}

}
